package com.ruoyi.management.base.utils;

import java.time.LocalDate;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Date;


public class DateUtils {
    public static Date getLastMonth(String date) {
        if (date == null || date.trim().isEmpty()) {
            throw new IllegalArgumentException("输入日期不能为空");
        }

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");

        YearMonth yearMonth;
        try {
            yearMonth = YearMonth.parse(date, formatter);
        } catch (DateTimeParseException e) {
            throw new IllegalArgumentException("输入日期格式不正确，应为 yyyy-MM", e);
        }

        YearMonth lastMonth = yearMonth.minusMonths(1);
        LocalDate firstDayOfLastMonth = lastMonth.atDay(1);

        // 使用固定时区（UTC）转换为 Date，确保环境一致性
        return Date.from(
                firstDayOfLastMonth.atStartOfDay(ZoneId.of("UTC"))
                        .toInstant()
        );
    }

    /**
     * 将格式为 yyyy-MM 的字符串转换为该月第一天的 Date 对象（UTC 时间）
     *
     * @param dateStr 输入日期字符串，如 "2025-01"
     * @return 当月第一天的 Date 对象
     */
    public static Date getFirstDayOfMonth(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            throw new IllegalArgumentException("输入日期不能为空");
        }

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");

        YearMonth yearMonth;
        try {
            yearMonth = YearMonth.parse(dateStr, formatter);
        } catch (DateTimeParseException e) {
            throw new IllegalArgumentException("输入日期格式不正确，应为 yyyy-MM", e);
        }

        LocalDate firstDayOfMonth = yearMonth.atDay(1);

        // 转换为 UTC 时间的 Date
        return Date.from(
                firstDayOfMonth.atStartOfDay(ZoneId.of("UTC")).toInstant()
        );
    }

    /**
     * 将格式为 yyyy-MM 的字符串转换为该月最后一天的 Date 对象（UTC 时间）
     *
     * @param dateStr 输入日期字符串，如 "2025-01"
     * @return 当月最后一天的 Date 对象
     */
    public static Date getLastDayOfMonth(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            throw new IllegalArgumentException("输入日期不能为空");
        }

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");

        YearMonth yearMonth;
        try {
            yearMonth = YearMonth.parse(dateStr, formatter);
        } catch (DateTimeParseException e) {
            throw new IllegalArgumentException("输入日期格式不正确，应为 yyyy-MM", e);
        }

        LocalDate lastDayOfMonth = yearMonth.atEndOfMonth(); // 获取该月最后一天

        // 转换为 UTC 时间的 Date
        return Date.from(
                lastDayOfMonth.atStartOfDay(ZoneId.of("UTC")).toInstant()
        );
    }

    /**
     * 将格式为 yyyy-MM 的字符串转换为“下个月”第15天的 Date 对象（UTC 时间）
     *
     * @param dateStr 输入日期字符串，如 "2025-01"
     * @return 下个月第15天的 Date 对象
     */
    public static Date getDay15OfNextMonth(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            throw new IllegalArgumentException("输入日期不能为空");
        }

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");

        YearMonth yearMonth;
        try {
            yearMonth = YearMonth.parse(dateStr, formatter);
        } catch (DateTimeParseException e) {
            throw new IllegalArgumentException("输入日期格式不正确，应为 yyyy-MM", e);
        }

        // 获取下个月
        LocalDate day15OfNextMonth = yearMonth.plusMonths(1).atDay(15); // 获取下个月第15天

        // 转换为 UTC 时间的 Date
        return Date.from(
                day15OfNextMonth.atStartOfDay(ZoneId.of("UTC")).toInstant()
        );
    }

}
